Demos #16
38 changed files with 665 additions and 174 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -7,7 +7,8 @@
|
||||||
!.gitignore
|
!.gitignore
|
||||||
!codecov.yml
|
!codecov.yml
|
||||||
!skeleton.html
|
!skeleton.html
|
||||||
!meson.build
|
!**/meson.build
|
||||||
|
!**/*.wrap
|
||||||
!meson_options.txt
|
!meson_options.txt
|
||||||
!compile_wasm.py
|
!compile_wasm.py
|
||||||
!compile_android.py
|
!compile_android.py
|
||||||
12
README.md
12
README.md
|
|
@ -57,7 +57,6 @@ There are some assumptions that should be considered when developing application
|
||||||
* Better EventManager - there are several optimization and improvements that can be added in the future.
|
* Better EventManager - there are several optimization and improvements that can be added in the future.
|
||||||
* More demos and examples - demo appliaction is very basic now, but in future more minigames and sanbox mode (opportunity to mix many components and systems) are planned.
|
* More demos and examples - demo appliaction is very basic now, but in future more minigames and sanbox mode (opportunity to mix many components and systems) are planned.
|
||||||
* C API - in highly depends on amount of work required. Makes possible to use library from different languages.
|
* C API - in highly depends on amount of work required. Makes possible to use library from different languages.
|
||||||
* GPU compute - idea in draft stage. Special components and systems whose data wolud be on GPU memory.
|
|
||||||
* More smaller improvements...
|
* More smaller improvements...
|
||||||
|
|
||||||
For more information about design and usage feel free to read [documentation](https://mergul.gitlab.io/bubel-ecs/ecs.html)**(WIP)** and [WIKI](https://gitlab.com/Mergul/bubel-ecs/-/wikis/home).
|
For more information about design and usage feel free to read [documentation](https://mergul.gitlab.io/bubel-ecs/ecs.html)**(WIP)** and [WIKI](https://gitlab.com/Mergul/bubel-ecs/-/wikis/home).
|
||||||
|
|
@ -104,14 +103,12 @@ Online demo support multithreading and page tries to check if client support WAS
|
||||||
|
|
||||||
struct Position
|
struct Position
|
||||||
{
|
{
|
||||||
mixin ECS.Components; //makes struct component
|
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Velocity
|
struct Velocity
|
||||||
{
|
{
|
||||||
mixin ECS.Components;
|
|
||||||
//default values works
|
//default values works
|
||||||
float x = 0.1;
|
float x = 0.1;
|
||||||
float y = 1;
|
float y = 1;
|
||||||
|
|
@ -119,7 +116,6 @@ struct Velocity
|
||||||
|
|
||||||
struct StaticFlag
|
struct StaticFlag
|
||||||
{
|
{
|
||||||
mixin ECS.Components;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct UpdateSystem
|
struct UpdateSystem
|
||||||
|
|
@ -132,7 +128,7 @@ struct UpdateSystem
|
||||||
{
|
{
|
||||||
int length; //entities count
|
int length; //entities count
|
||||||
@readonly Entity[] entities; //entities arrays, entity contain ID only
|
@readonly Entity[] entities; //entities arrays, entity contain ID only
|
||||||
Position[] positions; //positions array
|
Position[] positions; //positions array, by default components are considered to has write access (used for multithreading dependencies)
|
||||||
@readonly Velocity[] velocities; //veocities array, readonly (Multithreading tag)
|
@readonly Velocity[] velocities; //veocities array, readonly (Multithreading tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -158,7 +154,7 @@ void main()
|
||||||
manager.endRegister();
|
manager.endRegister();
|
||||||
|
|
||||||
//allocate template
|
//allocate template
|
||||||
EntityTemplate* tmpl = manager.allocateEmplate([Velocity.component_id, Position.component_id].staticArray);
|
EntityTemplate* tmpl = manager.allocateEmplate([becsID!Velocity, becsID!Position].staticArray);
|
||||||
scope (exit) manager.freeTemplate(tmpl);
|
scope (exit) manager.freeTemplate(tmpl);
|
||||||
|
|
||||||
//gets pointer to template component data
|
//gets pointer to template component data
|
||||||
|
|
@ -170,9 +166,9 @@ void main()
|
||||||
manager.addEntity(tmpl);
|
manager.addEntity(tmpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
manager.begin(); //start frame
|
manager.begin(); //start frame, inside system onBegin callbacks are called
|
||||||
manager.update(); //update all systems, there onUpdate callbacks are called
|
manager.update(); //update all systems, there onUpdate callbacks are called
|
||||||
manager.end(); //end frame
|
manager.end(); //end frame, inside system onEnd callbacks are called
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
|
||||||
1
demos/.gitignore
vendored
1
demos/.gitignore
vendored
|
|
@ -15,5 +15,6 @@
|
||||||
!emscripten_shell.html
|
!emscripten_shell.html
|
||||||
!emscripten_multi_shell.html
|
!emscripten_multi_shell.html
|
||||||
!compile_android.py
|
!compile_android.py
|
||||||
|
!**/meson.build
|
||||||
.dub
|
.dub
|
||||||
Android
|
Android
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
|
|
||||||
|
#ifdef GLES
|
||||||
precision mediump int;
|
precision mediump int;
|
||||||
precision mediump float;
|
precision mediump float;
|
||||||
precision lowp sampler2D;
|
precision lowp sampler2D;
|
||||||
precision lowp samplerCube;
|
precision lowp samplerCube;
|
||||||
|
|
||||||
|
|
||||||
#ifdef GLES
|
|
||||||
#define TEX(x,y) texture2D(x,y)
|
#define TEX(x,y) texture2D(x,y)
|
||||||
#if __VERSION__ >290
|
#if __VERSION__ >290
|
||||||
#define M_IN in mediump
|
#define M_IN in mediump
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
|
|
||||||
|
#ifdef GLES
|
||||||
precision highp float;
|
precision highp float;
|
||||||
precision highp int;
|
precision highp int;
|
||||||
precision lowp sampler2D;
|
precision lowp sampler2D;
|
||||||
precision lowp samplerCube;
|
precision lowp samplerCube;
|
||||||
#ifdef GLES
|
|
||||||
#if __VERSION__ >290
|
#if __VERSION__ >290
|
||||||
#define LOC(x) layout(location = x)
|
#define LOC(x) layout(location = x)
|
||||||
#define ATT in
|
#define ATT in
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
|
|
||||||
|
#ifdef GLES
|
||||||
precision mediump int;
|
precision mediump int;
|
||||||
precision mediump float;
|
precision mediump float;
|
||||||
precision lowp sampler2D;
|
precision lowp sampler2D;
|
||||||
precision lowp samplerCube;
|
precision lowp samplerCube;
|
||||||
|
|
||||||
|
|
||||||
#ifdef GLES
|
|
||||||
#define TEX(x,y) texture2D(x,y)
|
#define TEX(x,y) texture2D(x,y)
|
||||||
#if __VERSION__ >290
|
#if __VERSION__ >290
|
||||||
#define M_IN in mediump
|
#define M_IN in mediump
|
||||||
|
|
@ -14,11 +13,12 @@ precision lowp samplerCube;
|
||||||
#define L_IN varying lowp
|
#define L_IN varying lowp
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#define TEX(x,y) texture(x,y)
|
|
||||||
#if __VERSION__ > 320
|
#if __VERSION__ > 320
|
||||||
|
#define TEX(x,y) texture(x,y)
|
||||||
#define M_IN in
|
#define M_IN in
|
||||||
#define L_IN in
|
#define L_IN in
|
||||||
#else
|
#else
|
||||||
|
#define TEX(x,y) texture2D(x,y)
|
||||||
#define M_IN varying
|
#define M_IN varying
|
||||||
#define L_IN varying
|
#define L_IN varying
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
|
|
||||||
|
#ifdef GLES
|
||||||
precision highp float;
|
precision highp float;
|
||||||
precision highp int;
|
precision highp int;
|
||||||
precision lowp sampler2D;
|
precision lowp sampler2D;
|
||||||
precision lowp samplerCube;
|
precision lowp samplerCube;
|
||||||
#ifdef GLES
|
|
||||||
#if __VERSION__ >290
|
#if __VERSION__ >290
|
||||||
#define LOC(x) layout(location = x)
|
#define LOC(x) layout(location = x)
|
||||||
#define ATT in
|
#define ATT in
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
|
|
||||||
|
#ifdef GLES
|
||||||
precision mediump int;
|
precision mediump int;
|
||||||
precision mediump float;
|
precision mediump float;
|
||||||
precision lowp sampler2D;
|
precision lowp sampler2D;
|
||||||
precision lowp samplerCube;
|
precision lowp samplerCube;
|
||||||
|
|
||||||
|
|
||||||
#ifdef GLES
|
|
||||||
#define TEX(x,y) texture2D(x,y)
|
#define TEX(x,y) texture2D(x,y)
|
||||||
#if __VERSION__ >290
|
#if __VERSION__ >290
|
||||||
#define M_IN in mediump
|
#define M_IN in mediump
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
|
|
||||||
|
#ifdef GLES
|
||||||
precision highp float;
|
precision highp float;
|
||||||
precision highp int;
|
precision highp int;
|
||||||
precision lowp sampler2D;
|
precision lowp sampler2D;
|
||||||
precision lowp samplerCube;
|
precision lowp samplerCube;
|
||||||
#ifdef GLES
|
|
||||||
#if __VERSION__ >290
|
#if __VERSION__ >290
|
||||||
#define LOC(x) layout(location = x)
|
#define LOC(x) layout(location = x)
|
||||||
#define ATT in
|
#define ATT in
|
||||||
|
|
|
||||||
12
demos/external/meson.build
vendored
Normal file
12
demos/external/meson.build
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
demos_src += files(
|
||||||
|
'sources/cimgui/cimgui.d',
|
||||||
|
'sources/glad/gl/all.d',
|
||||||
|
'sources/glad/gl/enums.d',
|
||||||
|
'sources/glad/gl/ext.d',
|
||||||
|
'sources/glad/gl/funcs.d',
|
||||||
|
'sources/glad/gl/gl.d',
|
||||||
|
'sources/glad/gl/gles2.d',
|
||||||
|
'sources/glad/gl/loader.d',
|
||||||
|
'sources/glad/gl/types.d',
|
||||||
|
'sources/mmutils/thread_pool.d',
|
||||||
|
)
|
||||||
35
demos/meson.build
Normal file
35
demos/meson.build
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
# Files
|
||||||
|
demos_src = files()
|
||||||
|
external_src = files()
|
||||||
|
subdir('source')
|
||||||
|
subdir('external')
|
||||||
|
|
||||||
|
demos_inc = include_directories('source/')
|
||||||
|
external_inc = include_directories('external/sources/')
|
||||||
|
|
||||||
|
# Argumesnts
|
||||||
|
versions = ['BindSDL_Image','SDL_208', 'BindBC_Static', 'BindSDL_Static']
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
bindbc_loader_dep = dependency('bindbc-loader')
|
||||||
|
bindbc_sdl_dep = dependency('bindbc-sdl')
|
||||||
|
cimgui_dep = dependency('cimgui')
|
||||||
|
sdl2_dep = dependency('SDL2')
|
||||||
|
sdl2_image_dep = dependency('SDL2_image')
|
||||||
|
|
||||||
|
subdir('utils') # Utils library
|
||||||
|
|
||||||
|
executable('decs-demos', [demos_src, external_src],
|
||||||
|
include_directories : [demos_inc, external_inc],
|
||||||
|
d_module_versions : versions,
|
||||||
|
link_with : [ecs_lib, ecs_utils_lib],
|
||||||
|
dependencies : [
|
||||||
|
bindbc_loader_dep,
|
||||||
|
bindbc_sdl_dep,
|
||||||
|
cimgui_dep,
|
||||||
|
decs_dep,
|
||||||
|
ecs_utils_dep,
|
||||||
|
sdl2_dep,
|
||||||
|
sdl2_image_dep,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
@ -75,6 +75,7 @@ struct Launcher
|
||||||
double delta_time;
|
double delta_time;
|
||||||
uint fps;
|
uint fps;
|
||||||
vec2 render_position;
|
vec2 render_position;
|
||||||
|
bool play = true;
|
||||||
|
|
||||||
Tool used_tool;
|
Tool used_tool;
|
||||||
int tool_size = 100;
|
int tool_size = 100;
|
||||||
|
|
@ -85,6 +86,7 @@ struct Launcher
|
||||||
bool tool_mode = true;
|
bool tool_mode = true;
|
||||||
ToolCircle* tool_circle;
|
ToolCircle* tool_circle;
|
||||||
bool show_filtered;
|
bool show_filtered;
|
||||||
|
EntityID selected_entity;
|
||||||
|
|
||||||
bool swap_interval = true;
|
bool swap_interval = true;
|
||||||
|
|
||||||
|
|
@ -95,6 +97,7 @@ struct Launcher
|
||||||
bool show_stat_wnd = true;
|
bool show_stat_wnd = true;
|
||||||
bool show_tips = true;
|
bool show_tips = true;
|
||||||
bool show_demo_wnd = true;
|
bool show_demo_wnd = true;
|
||||||
|
bool show_tools_wnd = true;
|
||||||
bool show_virtual_keys_wnd = false;
|
bool show_virtual_keys_wnd = false;
|
||||||
bool show_profile_wnd = true;
|
bool show_profile_wnd = true;
|
||||||
|
|
||||||
|
|
@ -110,10 +113,16 @@ struct Launcher
|
||||||
float draw_time = 0;
|
float draw_time = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double deltaTime()
|
||||||
|
{
|
||||||
|
return delta_time * play;
|
||||||
|
}
|
||||||
|
|
||||||
DemoCallbacks demo;
|
DemoCallbacks demo;
|
||||||
|
|
||||||
void switchDemo(DemoCallbacks callbacks)//void function() start, bool function() loop, void function() end, void function(SDL_Event*) event, const (char)* tips)
|
void switchDemo(DemoCallbacks callbacks)//void function() start, bool function() loop, void function() end, void function(SDL_Event*) event, const (char)* tips)
|
||||||
{
|
{
|
||||||
|
show_tips = true;
|
||||||
gui_manager.clear();
|
gui_manager.clear();
|
||||||
//launcher.ent
|
//launcher.ent
|
||||||
|
|
||||||
|
|
@ -164,6 +173,7 @@ struct Launcher
|
||||||
ComponentRef[] add_comps;
|
ComponentRef[] add_comps;
|
||||||
ushort[] rem_comps;
|
ushort[] rem_comps;
|
||||||
ushort[] filter;
|
ushort[] filter;
|
||||||
|
float distance = float.max;
|
||||||
|
|
||||||
bool filterEntity(ref const Entity entity)
|
bool filterEntity(ref const Entity entity)
|
||||||
{
|
{
|
||||||
|
|
@ -222,6 +232,21 @@ struct Launcher
|
||||||
if(length < size2)gEM.removeComponents(data.entity[i].id, rem_comps);
|
if(length < size2)gEM.removeComponents(data.entity[i].id, rem_comps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void selectEntity(IteratorSystem.EntitiesData data)
|
||||||
|
{
|
||||||
|
if(!filterEntity(data.entity[0]))return;
|
||||||
|
foreach(i;0..data.length)
|
||||||
|
{
|
||||||
|
vec2 rel_vec = data.location[i] - position;
|
||||||
|
float length = rel_vec.x * rel_vec.x + rel_vec.y * rel_vec.y;
|
||||||
|
if(length < distance)
|
||||||
|
{
|
||||||
|
distance = length;
|
||||||
|
launcher.selected_entity = data.entity[i].id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float half_size = tool_size * 0.5;
|
float half_size = tool_size * 0.5;
|
||||||
|
|
@ -276,6 +301,10 @@ struct Launcher
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case Tool.selector:
|
||||||
|
iterator.distance = size2;
|
||||||
|
manager.callEntitiesFunction!IteratorSystem(&iterator.selectEntity);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -717,12 +746,14 @@ void mainLoop(void* arg)
|
||||||
|
|
||||||
if(launcher.show_tips)
|
if(launcher.show_tips)
|
||||||
{
|
{
|
||||||
igSetNextWindowPos(ImVec2(launcher.window_size.x - 550, 80), ImGuiCond_Once, ImVec2(0,0));
|
igSetNextWindowPos(ImVec2(launcher.window_size.x /2 -250, 100), ImGuiCond_Once, ImVec2(0,0));
|
||||||
igSetNextWindowSize(ImVec2(300, 0), ImGuiCond_Once);
|
igSetNextWindowSize(ImVec2(500, -1), ImGuiCond_Once);
|
||||||
igSetNextWindowBgAlpha(launcher.windows_alpha);
|
igSetNextWindowBgAlpha(0.95);
|
||||||
if(igBegin("Tips",&launcher.show_tips,ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings))
|
if(igBegin("Tips",&launcher.show_tips,ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings))
|
||||||
{
|
{
|
||||||
|
// igBeginChild("",ImVec2(0,0),0,0);
|
||||||
igTextWrapped(launcher.demo.tips);
|
igTextWrapped(launcher.demo.tips);
|
||||||
|
// igEndChild();
|
||||||
}
|
}
|
||||||
igEnd();
|
igEnd();
|
||||||
}
|
}
|
||||||
|
|
@ -730,9 +761,10 @@ void mainLoop(void* arg)
|
||||||
if(launcher.show_demo_wnd)
|
if(launcher.show_demo_wnd)
|
||||||
{
|
{
|
||||||
igSetNextWindowPos(ImVec2(launcher.window_size.x - 260, 30), ImGuiCond_Once, ImVec2(0,0));
|
igSetNextWindowPos(ImVec2(launcher.window_size.x - 260, 30), ImGuiCond_Once, ImVec2(0,0));
|
||||||
igSetNextWindowSize(ImVec2(250, launcher.window_size.y - 60), ImGuiCond_Once);
|
igSetNextWindowSize(ImVec2(250, 300), ImGuiCond_Once);
|
||||||
if(igBegin("Demo",&launcher.show_demo_wnd,0))
|
if(igBegin("Demo",&launcher.show_demo_wnd,0))
|
||||||
{
|
{
|
||||||
|
igCheckbox("Play",&launcher.play);
|
||||||
ImDrawList* draw_list = igGetWindowDrawList();
|
ImDrawList* draw_list = igGetWindowDrawList();
|
||||||
igBeginGroup();
|
igBeginGroup();
|
||||||
launcher.gui_manager.gui();
|
launcher.gui_manager.gui();
|
||||||
|
|
@ -742,11 +774,11 @@ void mainLoop(void* arg)
|
||||||
//ImDrawList_AddRect(draw_list, igGetItemRectMin(), igGetItemRectMax(), igColorConvertFloat4ToU32(ImVec4(0.4,0.4,0.4,0.4)), -1, 0, 1);
|
//ImDrawList_AddRect(draw_list, igGetItemRectMin(), igGetItemRectMax(), igColorConvertFloat4ToU32(ImVec4(0.4,0.4,0.4,0.4)), -1, 0, 1);
|
||||||
//igBeginChildFrame(1,ImVec2(0,-1),ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_ChildWindow);
|
//igBeginChildFrame(1,ImVec2(0,-1),ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_ChildWindow);
|
||||||
//igBeginChild("Tool frame",ImVec2(-1,-1),true,0);
|
//igBeginChild("Tool frame",ImVec2(-1,-1),true,0);
|
||||||
igBeginGroup();
|
// igBeginGroup();
|
||||||
if(igCollapsingHeader("Tool##ToolHeader", ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_DefaultOpen))
|
// if(igCollapsingHeader("Tool##ToolHeader", ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_DefaultOpen))
|
||||||
{
|
// {
|
||||||
igIndent(8);
|
// igIndent(8);
|
||||||
if(igBeginCombo("Tool",tool_strings[launcher.used_tool],0))
|
/*if(igBeginCombo("Tool",tool_strings[launcher.used_tool],0))
|
||||||
{
|
{
|
||||||
if(igSelectable("Entity spawner",false,0,ImVec2(0,0)))
|
if(igSelectable("Entity spawner",false,0,ImVec2(0,0)))
|
||||||
{
|
{
|
||||||
|
|
@ -761,8 +793,48 @@ void mainLoop(void* arg)
|
||||||
launcher.used_tool = Tool.selector;
|
launcher.used_tool = Tool.selector;
|
||||||
}
|
}
|
||||||
igEndCombo();
|
igEndCombo();
|
||||||
|
}*/
|
||||||
|
/*if(igSelectable("Entity spawner",false,0,ImVec2(0,0)))
|
||||||
|
{
|
||||||
|
launcher.used_tool = Tool.entity_spawner;
|
||||||
}
|
}
|
||||||
|
if(igSelectable("Component manipulator",false,0,ImVec2(0,0)))
|
||||||
|
{
|
||||||
|
launcher.used_tool = Tool.component_manipulator;
|
||||||
|
}
|
||||||
|
if(igSelectable("Selector",false,0,ImVec2(0,0)))
|
||||||
|
{
|
||||||
|
launcher.used_tool = Tool.selector;
|
||||||
|
}*/
|
||||||
|
/*if(igBeginTabBar("Tool",ImGuiTabBarFlags_NoCloseWithMiddleMouseButton))
|
||||||
|
{
|
||||||
if(igIsItemHovered(0))igSetTooltip("Select tool (CTRL + 1,2,3)");
|
if(igIsItemHovered(0))igSetTooltip("Select tool (CTRL + 1,2,3)");
|
||||||
|
bool a = 1;
|
||||||
|
//this is used as hack to make CTRL+1/2/3 tab selection possible
|
||||||
|
static Tool prev_tool = Tool.entity_spawner;
|
||||||
|
bool different = prev_tool != launcher.used_tool;
|
||||||
|
Tool tool;
|
||||||
|
if(igBeginTabItem("Entity spawner", &a, launcher.used_tool == Tool.entity_spawner && different ? ImGuiTabItemFlags_SetSelected : 0))
|
||||||
|
{
|
||||||
|
tool = Tool.entity_spawner;
|
||||||
|
igEndTabItem();
|
||||||
|
}
|
||||||
|
if(igBeginTabItem("Component manipulator", &a, launcher.used_tool == Tool.component_manipulator && different ? ImGuiTabItemFlags_SetSelected : 0))
|
||||||
|
{
|
||||||
|
tool = Tool.component_manipulator;
|
||||||
|
igEndTabItem();
|
||||||
|
}
|
||||||
|
if(igBeginTabItem("Selector", &a, launcher.used_tool == Tool.selector && different ? ImGuiTabItemFlags_SetSelected : 0))
|
||||||
|
{
|
||||||
|
tool = Tool.selector;
|
||||||
|
igEndTabItem();
|
||||||
|
}
|
||||||
|
launcher.used_tool = tool;
|
||||||
|
prev_tool = launcher.used_tool;
|
||||||
|
}
|
||||||
|
igEndTabBar();
|
||||||
|
|
||||||
|
|
||||||
igCheckbox("Show Tool", &launcher.tool_show);
|
igCheckbox("Show Tool", &launcher.tool_show);
|
||||||
if(igIsItemHovered(0))igSetTooltip("Show/hide graphical tool representation");
|
if(igIsItemHovered(0))igSetTooltip("Show/hide graphical tool representation");
|
||||||
igSameLine(0,4);
|
igSameLine(0,4);
|
||||||
|
|
@ -785,10 +857,11 @@ void mainLoop(void* arg)
|
||||||
|
|
||||||
igSliderInt("Tool size", &launcher.tool_size, 0, 256, null);
|
igSliderInt("Tool size", &launcher.tool_size, 0, 256, null);
|
||||||
igSliderFloat("Tool repeat", &launcher.tool_repeat, 0, 1024, null, 4);
|
igSliderFloat("Tool repeat", &launcher.tool_repeat, 0, 1024, null, 4);
|
||||||
launcher.gui_manager.toolGui();
|
launcher.gui_manager.toolGui();*/
|
||||||
igUnindent(8);
|
|
||||||
}
|
// igUnindent(8);
|
||||||
igEndGroup();
|
// }
|
||||||
|
// igEndGroup();
|
||||||
ImDrawList_AddRect(draw_list, igGetItemRectMin(), ImVec2(igGetWindowPos().x+igGetWindowWidth()-2,igGetItemRectMax().y), igColorConvertFloat4ToU32(ImVec4(0.4,0.4,0.4,0.4)), 2, ImDrawCornerFlags_All, 1);
|
ImDrawList_AddRect(draw_list, igGetItemRectMin(), ImVec2(igGetWindowPos().x+igGetWindowWidth()-2,igGetItemRectMax().y), igColorConvertFloat4ToU32(ImVec4(0.4,0.4,0.4,0.4)), 2, ImDrawCornerFlags_All, 1);
|
||||||
|
|
||||||
//igBeginGroup();
|
//igBeginGroup();
|
||||||
|
|
@ -813,6 +886,75 @@ void mainLoop(void* arg)
|
||||||
igEnd();
|
igEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(launcher.show_tools_wnd)
|
||||||
|
{
|
||||||
|
|
||||||
|
igSetNextWindowPos(ImVec2(launcher.window_size.x - 300, 340), ImGuiCond_Once, ImVec2(0,0));
|
||||||
|
igSetNextWindowSize(ImVec2(300, launcher.window_size.y - 370), ImGuiCond_Once);
|
||||||
|
if(igBegin("Tools", &launcher.show_tools_wnd, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse))
|
||||||
|
{
|
||||||
|
if(igIsItemHovered(0))igSetTooltip("Select tool (CTRL + 1,2,3)");
|
||||||
|
|
||||||
|
if(igBeginTabBar("Tool",ImGuiTabBarFlags_NoCloseWithMiddleMouseButton))
|
||||||
|
{
|
||||||
|
bool a = 1;
|
||||||
|
//this is used as hack to make CTRL+1/2/3 tab selection possible
|
||||||
|
static Tool prev_tool = Tool.entity_spawner;
|
||||||
|
bool different = prev_tool != launcher.used_tool;
|
||||||
|
Tool tool;
|
||||||
|
if(igBeginTabItem("Entity spawner", &a, launcher.used_tool == Tool.entity_spawner && different ? ImGuiTabItemFlags_SetSelected : 0))
|
||||||
|
{
|
||||||
|
tool = Tool.entity_spawner;
|
||||||
|
igEndTabItem();
|
||||||
|
}
|
||||||
|
if(igBeginTabItem("Component manipulator", &a, launcher.used_tool == Tool.component_manipulator && different ? ImGuiTabItemFlags_SetSelected : 0))
|
||||||
|
{
|
||||||
|
tool = Tool.component_manipulator;
|
||||||
|
igEndTabItem();
|
||||||
|
}
|
||||||
|
if(igBeginTabItem("Selector", &a, launcher.used_tool == Tool.selector && different ? ImGuiTabItemFlags_SetSelected : 0))
|
||||||
|
{
|
||||||
|
tool = Tool.selector;
|
||||||
|
igEndTabItem();
|
||||||
|
}
|
||||||
|
launcher.used_tool = tool;
|
||||||
|
prev_tool = launcher.used_tool;
|
||||||
|
}
|
||||||
|
igEndTabBar();
|
||||||
|
|
||||||
|
|
||||||
|
igCheckbox("Show Tool", &launcher.tool_show);
|
||||||
|
if(igIsItemHovered(0))igSetTooltip("Show/hide graphical tool representation");
|
||||||
|
igSameLine(0,4);
|
||||||
|
igCheckbox("Show Filtered", &launcher.show_filtered);
|
||||||
|
if(igIsItemHovered(0))igSetTooltip("Show/hide filtered entities");
|
||||||
|
if(launcher.used_tool == Tool.component_manipulator)
|
||||||
|
{
|
||||||
|
igCheckbox("Override", &launcher.override_);
|
||||||
|
}
|
||||||
|
|
||||||
|
//igSelectable("Selectabe",false,ImGuiSelectableFlags_None,ImVec2(0,0));
|
||||||
|
if(launcher.used_tool != Tool.selector)
|
||||||
|
{
|
||||||
|
if(igRadioButtonBool("Add", launcher.tool_mode))launcher.tool_mode = true;
|
||||||
|
if(igIsItemHovered(0))igSetTooltip("Tool should adding (Entities or components)");
|
||||||
|
igSameLine(0,4);
|
||||||
|
if(igRadioButtonBool("Remove", !launcher.tool_mode))launcher.tool_mode = false;
|
||||||
|
if(igIsItemHovered(0))igSetTooltip("Tool should removing (Entities or components)");
|
||||||
|
}
|
||||||
|
|
||||||
|
igSliderInt("Tool size", &launcher.tool_size, 0, 256, null);
|
||||||
|
igSliderFloat("Tool repeat", &launcher.tool_repeat, 0, 1024, null, 4);
|
||||||
|
|
||||||
|
if(igBeginChild("",ImVec2(0,0),1,0))
|
||||||
|
{
|
||||||
|
launcher.gui_manager.toolGui();
|
||||||
|
}
|
||||||
|
igEndChild();
|
||||||
|
}
|
||||||
|
igEnd();
|
||||||
|
}
|
||||||
|
|
||||||
if(launcher.show_profile_wnd)
|
if(launcher.show_profile_wnd)
|
||||||
{
|
{
|
||||||
//igSetNextWindowPos(ImVec2(launcher.window_size.x - 260, launcher.window_size.y - 280), ImGuiCond_Once, ImVec2(0,0));
|
//igSetNextWindowPos(ImVec2(launcher.window_size.x - 260, launcher.window_size.y - 280), ImGuiCond_Once, ImVec2(0,0));
|
||||||
|
|
@ -864,11 +1006,21 @@ void mainLoop(void* arg)
|
||||||
|
|
||||||
double loop_time = launcher.getTime();
|
double loop_time = launcher.getTime();
|
||||||
launcher.job_updater.pool.tryWaitCount = 10000;
|
launcher.job_updater.pool.tryWaitCount = 10000;
|
||||||
|
if(launcher.play)
|
||||||
|
{
|
||||||
if(launcher.demo.loop && !launcher.demo.loop())
|
if(launcher.demo.loop && !launcher.demo.loop())
|
||||||
{
|
{
|
||||||
quit();
|
quit();
|
||||||
*cast(bool*)arg = false;
|
*cast(bool*)arg = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
launcher.manager.begin();
|
||||||
|
import game_core.rendering;
|
||||||
|
launcher.manager.callEntitiesFunction!DrawSystem(&(launcher.manager.getSystem!DrawSystem).onUpdate);
|
||||||
|
launcher.manager.end();
|
||||||
|
}
|
||||||
launcher.job_updater.pool.tryWaitCount = 0;
|
launcher.job_updater.pool.tryWaitCount = 0;
|
||||||
|
|
||||||
loop_time = launcher.getTime() - loop_time;
|
loop_time = launcher.getTime() - loop_time;
|
||||||
|
|
@ -1119,7 +1271,7 @@ int app_main(int argc, char** argv)
|
||||||
// launcher.switchDemo(&simpleStart,&simpleLoop,&simpleEnd,&simpleEvent,Simple.tips);
|
// launcher.switchDemo(&simpleStart,&simpleLoop,&simpleEnd,&simpleEvent,Simple.tips);
|
||||||
// launcher.switchDemo(getParticlesDemo());
|
// launcher.switchDemo(getParticlesDemo());
|
||||||
// launcher.switchDemo(getSimpleDemo());
|
// launcher.switchDemo(getSimpleDemo());
|
||||||
launcher.switchDemo(getBrickBreakerDemo());
|
launcher.switchDemo(getSimpleDemo());
|
||||||
}
|
}
|
||||||
|
|
||||||
int key_num;
|
int key_num;
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,13 @@ extern(C):
|
||||||
|
|
||||||
private enum float px = 1.0/512.0;
|
private enum float px = 1.0/512.0;
|
||||||
|
|
||||||
|
float clamp(float v, float min, float max)
|
||||||
|
{
|
||||||
|
if(v<min)return min;
|
||||||
|
else if (v>max)return max;
|
||||||
|
else return v;
|
||||||
|
}
|
||||||
|
|
||||||
/*#######################################################################################################################
|
/*#######################################################################################################################
|
||||||
------------------------------------------------ Components ------------------------------------------------------------------
|
------------------------------------------------ Components ------------------------------------------------------------------
|
||||||
#######################################################################################################################*/
|
#######################################################################################################################*/
|
||||||
|
|
@ -185,6 +192,7 @@ struct BallCollisionSystem
|
||||||
{
|
{
|
||||||
bool test(EntityID id)
|
bool test(EntityID id)
|
||||||
{
|
{
|
||||||
|
if(id == data.entity[i].id)return true;
|
||||||
Entity* entity = launcher.manager.getEntity(id);
|
Entity* entity = launcher.manager.getEntity(id);
|
||||||
if(entity)
|
if(entity)
|
||||||
{
|
{
|
||||||
|
|
@ -192,50 +200,32 @@ struct BallCollisionSystem
|
||||||
CScale* scale = entity.getComponent!CScale;
|
CScale* scale = entity.getComponent!CScale;
|
||||||
if(location && scale)
|
if(location && scale)
|
||||||
{
|
{
|
||||||
float radius = data.scale[i].x;
|
float radius = data.scale[i].x*0.5;
|
||||||
vec2 rel_pos = *location - data.location[i];
|
vec2 rel_pos = *location - data.location[i];
|
||||||
vec2 abs_rel_pos = rel_pos;
|
|
||||||
if(abs_rel_pos.x < 0)abs_rel_pos.x = -abs_rel_pos.x;
|
|
||||||
if(abs_rel_pos.y < 0)abs_rel_pos.y = -abs_rel_pos.y;
|
|
||||||
|
|
||||||
vec2 half_scale = *scale * 0.25f;
|
vec2 half_scale = *scale * 0.5f;
|
||||||
|
|
||||||
if(abs_rel_pos.x < half_scale.x + radius &&
|
vec2 nearest_point;
|
||||||
abs_rel_pos.y < half_scale.y + radius)
|
nearest_point.x = clamp(rel_pos.x, -half_scale.x, half_scale.x);
|
||||||
{
|
nearest_point.y = clamp(rel_pos.y, -half_scale.y, half_scale.y);
|
||||||
if(abs_rel_pos.x < half_scale.x)
|
|
||||||
{
|
vec2 vector;
|
||||||
if(rel_pos.y * data.velocity[i].y > 0)
|
if(nearest_point == rel_pos)
|
||||||
{
|
{
|
||||||
data.velocity[i].y = -data.velocity[i].y;
|
vector = nearest_point;
|
||||||
launcher.manager.sendEvent(id,EDamage(1));
|
radius = float.max;
|
||||||
return false;
|
}
|
||||||
}
|
else vector = nearest_point - rel_pos;
|
||||||
}
|
float pow_dist = dot(vector, vector);
|
||||||
else if(abs_rel_pos.y < half_scale.y)
|
|
||||||
{
|
if(dot(data.velocity[i], vector) > 0.01)return true;
|
||||||
if(rel_pos.x * data.velocity[i].x > 0)
|
|
||||||
{
|
|
||||||
data.velocity[i].x = -data.velocity[i].x;
|
|
||||||
launcher.manager.sendEvent(id,EDamage(1));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vec2 vector = abs_rel_pos - half_scale;
|
|
||||||
if(rel_pos.x > 0)vector.x = -vector.x;
|
|
||||||
if(rel_pos.y > 0)vector.y = -vector.y;
|
|
||||||
|
|
||||||
float pow_dist = vector.length2();
|
|
||||||
if(pow_dist < radius*radius)
|
if(pow_dist < radius*radius)
|
||||||
{
|
{
|
||||||
vector = vector / sqrtf(pow_dist);
|
vector = vector / sqrtf(pow_dist);
|
||||||
data.velocity[i] = data.velocity[i] - vector * (2 * dot(vector, data.velocity[i]));
|
data.velocity[i] = data.velocity[i] - vector * (2 * dot(vector, data.velocity[i]));
|
||||||
launcher.manager.sendEvent(id,EDamage(1));
|
launcher.manager.sendEvent(id,EDamage(1));
|
||||||
return false;
|
return cast(bool)(hits--);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -244,6 +234,7 @@ struct BallCollisionSystem
|
||||||
|
|
||||||
EntitiesData data;
|
EntitiesData data;
|
||||||
uint i;
|
uint i;
|
||||||
|
uint hits;
|
||||||
}
|
}
|
||||||
|
|
||||||
ShootGrid* grid;
|
ShootGrid* grid;
|
||||||
|
|
@ -279,6 +270,7 @@ struct BallCollisionSystem
|
||||||
foreach(i; 0..data.length)
|
foreach(i; 0..data.length)
|
||||||
{
|
{
|
||||||
state.i = i;
|
state.i = i;
|
||||||
|
state.hits = 1;
|
||||||
//float radius = data.scale[i].x;
|
//float radius = data.scale[i].x;
|
||||||
AABB bounding = AABB(data.location[i]-data.scale[i], data.location[i]+data.scale[i]);
|
AABB bounding = AABB(data.location[i]-data.scale[i], data.location[i]+data.scale[i]);
|
||||||
tree.test(bounding, cast(bool delegate(EntityID id))&state.test);
|
tree.test(bounding, cast(bool delegate(EntityID id))&state.test);
|
||||||
|
|
@ -317,7 +309,11 @@ struct DamageSystem
|
||||||
|
|
||||||
struct BrickBreakerDemo
|
struct BrickBreakerDemo
|
||||||
{
|
{
|
||||||
__gshared const (char)* tips = "Brick breaker demo. It's a game about destroying evil bricks.";
|
__gshared const (char)* tips = "Brick breaker demo. It's a game about destroying evil bricks.
|
||||||
|
|
||||||
|
This demo is usnfinished yet but collision works well. Bricks can be destroyed. Spawning thousands of bricks and then thousands of balls is good way to try demo.
|
||||||
|
Bricks uses StaticBVH, ball don't collide witch each other, paddle is added to dynamic BVH and collide with balls. But nothing keeps you from adding dynamic collision for balls.
|
||||||
|
Currently dynamic collisions are pretty slow as dynamic BVH is rebuilded every frame on single thread.";
|
||||||
|
|
||||||
//EntityTemplate* tmpl;
|
//EntityTemplate* tmpl;
|
||||||
Texture texture;
|
Texture texture;
|
||||||
|
|
@ -418,6 +414,7 @@ void brickBreakerStart()
|
||||||
launcher.gui_manager.addComponent(CBall(), "Ball");
|
launcher.gui_manager.addComponent(CBall(), "Ball");
|
||||||
launcher.gui_manager.addComponent(CBVH(), "BVH");
|
launcher.gui_manager.addComponent(CBVH(), "BVH");
|
||||||
launcher.gui_manager.addComponent(CAABB(), "AABB");
|
launcher.gui_manager.addComponent(CAABB(), "AABB");
|
||||||
|
launcher.gui_manager.addComponent(CStatic(), "Static Flag");
|
||||||
|
|
||||||
launcher.gui_manager.addSystem(becsID!MoveSystem, "Move System");
|
launcher.gui_manager.addSystem(becsID!MoveSystem, "Move System");
|
||||||
launcher.gui_manager.addSystem(becsID!EdgeCollisionSystem, "Edge Collision System");
|
launcher.gui_manager.addSystem(becsID!EdgeCollisionSystem, "Edge Collision System");
|
||||||
|
|
|
||||||
|
|
@ -180,7 +180,7 @@ struct DrawSystem
|
||||||
// {
|
// {
|
||||||
// foreach(i; 0..data.length)
|
// foreach(i; 0..data.length)
|
||||||
// {
|
// {
|
||||||
// data.locations[i] += data.velocity[i] * launcher.delta_time;
|
// data.locations[i] += data.velocity[i] * launcher.deltaTime;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
@ -208,7 +208,7 @@ struct MouseAttractSystem
|
||||||
|
|
||||||
void onUpdate(EntitiesData data)
|
void onUpdate(EntitiesData data)
|
||||||
{
|
{
|
||||||
float speed = launcher.delta_time * 0.01;
|
float speed = launcher.deltaTime * 0.01;
|
||||||
foreach(i;0..data.length)
|
foreach(i;0..data.length)
|
||||||
{
|
{
|
||||||
vec2 rel_pos = mouse_pos - data.locations[i];
|
vec2 rel_pos = mouse_pos - data.locations[i];
|
||||||
|
|
@ -236,7 +236,7 @@ struct AttractSystem
|
||||||
|
|
||||||
void onUpdate(AttractorIterator.EntitiesData adata)
|
void onUpdate(AttractorIterator.EntitiesData adata)
|
||||||
{
|
{
|
||||||
float speed = launcher.delta_time * 0.00004;
|
float speed = launcher.deltaTime * 0.00004;
|
||||||
if(adata.vortex)
|
if(adata.vortex)
|
||||||
{
|
{
|
||||||
foreach(i;0..data.length)
|
foreach(i;0..data.length)
|
||||||
|
|
@ -365,7 +365,7 @@ struct PlayAreaSystem
|
||||||
// {
|
// {
|
||||||
// foreach(i;0..10)
|
// foreach(i;0..10)
|
||||||
// {
|
// {
|
||||||
// damp[i] = powf((0.99 - cast(float)i * 0.01),launcher.delta_time*0.1);
|
// damp[i] = powf((0.99 - cast(float)i * 0.01),launcher.deltaTime*0.1);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// return true;
|
// return true;
|
||||||
|
|
@ -395,7 +395,7 @@ struct ParticleLifeSystem
|
||||||
|
|
||||||
bool onBegin()
|
bool onBegin()
|
||||||
{
|
{
|
||||||
delta_time = cast(int)(launcher.delta_time * 1000);
|
delta_time = cast(int)(launcher.deltaTime * 1000);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -423,7 +423,7 @@ struct GravitySystem
|
||||||
|
|
||||||
void onUpdate(EntitiesData data)
|
void onUpdate(EntitiesData data)
|
||||||
{
|
{
|
||||||
float delta_time = launcher.delta_time * 0.00_092;
|
float delta_time = launcher.deltaTime * 0.00_092;
|
||||||
foreach(i; 0..data.length)
|
foreach(i; 0..data.length)
|
||||||
{
|
{
|
||||||
data.velocity[i].y -= delta_time;
|
data.velocity[i].y -= delta_time;
|
||||||
|
|
@ -437,7 +437,8 @@ struct GravitySystem
|
||||||
|
|
||||||
struct ParticlesDemo
|
struct ParticlesDemo
|
||||||
{
|
{
|
||||||
__gshared const (char)* tips = "Use \"space\" to spwan entities.\n\nSystems can be enabled/disabled from \"Simple\" window.";
|
__gshared const (char)* tips = "Particles by default have no velocity. You can spawn \"Attractor\" which attract particles, or \"Vortex\" which attracts and spin particles.
|
||||||
|
Please do not spawn to many of them as every \"Attractor\" iterate over all particles (brute force).";
|
||||||
|
|
||||||
Texture texture;
|
Texture texture;
|
||||||
}
|
}
|
||||||
|
|
@ -471,6 +472,7 @@ void particlesRegister()
|
||||||
launcher.manager.registerComponent!CParticleLife;
|
launcher.manager.registerComponent!CParticleLife;
|
||||||
launcher.manager.registerComponent!CForceRange;
|
launcher.manager.registerComponent!CForceRange;
|
||||||
launcher.manager.registerComponent!CMaterialIndex;
|
launcher.manager.registerComponent!CMaterialIndex;
|
||||||
|
launcher.manager.registerComponent!CVelocityFactor;
|
||||||
|
|
||||||
launcher.manager.registerSystem!MoveSystem(0);
|
launcher.manager.registerSystem!MoveSystem(0);
|
||||||
launcher.manager.registerSystem!DrawSystem(100);
|
launcher.manager.registerSystem!DrawSystem(100);
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,7 @@ DemoCallbacks getSanboxDemo()
|
||||||
demo.initialize = &sandboxStart;
|
demo.initialize = &sandboxStart;
|
||||||
demo.deinitialize = &sandboxEnd;
|
demo.deinitialize = &sandboxEnd;
|
||||||
demo.loop = &sandboxLoop;
|
demo.loop = &sandboxLoop;
|
||||||
demo.tips = "tips";
|
demo.tips = "This demo contains all components, systems and events from previous demos. They was not designed for that kind of coexisting. Some system collide with other making some weird things.
|
||||||
|
This gives biggest opportunities. You can add tower on top of snake, or lasers to paddle from BrickBreaker. This will be improved in next versions of ECS demo.";
|
||||||
return demo;
|
return demo;
|
||||||
}
|
}
|
||||||
|
|
@ -99,7 +99,32 @@ struct MoveSystem
|
||||||
|
|
||||||
struct Simple
|
struct Simple
|
||||||
{
|
{
|
||||||
__gshared const (char)* tips = "Use \"space\" to spwan entities.\n\nSystems can be enabled/disabled from \"Simple\" window.";
|
__gshared const (char)* tips = "Use \"space\" to spwan entities.\n\nSystems can be enabled/disabled from \"Demo\" window.
|
||||||
|
\"Tools\" window exists of three tools which can be used to manipulate game.
|
||||||
|
Options:
|
||||||
|
* Show Tool - enable/disable rendering of blue circle around cursor
|
||||||
|
* Show Filtered - enable/disable higliting filtered entities. For \"Component manipulator\" tool it shows entities which has selected component.
|
||||||
|
* Add/Remove - select primary action. LMB - primary action, RMB - secondary action
|
||||||
|
* Tools size - size of tool
|
||||||
|
* Tool repeat - how many times in one second tool should take action (e.g. 1000 means every second \"Entity spawner\" will spawn 1000 enties)
|
||||||
|
* Override - enabled means that \"Component manipulator\" will override components data if entity already has that component
|
||||||
|
Tools:
|
||||||
|
* Entity spawner - used to spawn new entities
|
||||||
|
* Component manipulator - used to add/remove components to/from entities
|
||||||
|
* Selector - allow to select entity, show and modify his data. Only one entity can be selected, selector selects entity nearest co cursor.
|
||||||
|
|
||||||
|
ShortCuts:
|
||||||
|
* CRTL*1/2/3 - change tool
|
||||||
|
* Mouse wheel - change tool size
|
||||||
|
* SHIFT + Mouse wheel - change entity/component in tool list
|
||||||
|
* LBM - primary action (default: add entity / add component)
|
||||||
|
* RMB - secondary action (default: remove entity / remove component)
|
||||||
|
|
||||||
|
\"Statistic\" windows shows FPS and entities count.
|
||||||
|
|
||||||
|
From top menu bar (upper left corner) you can select different demos or change some options. Multihtreading is highly recommended, but it can not working on mobile phones or Firefox browser.
|
||||||
|
|
||||||
|
Demo is capable rendering of hundreds of thousands of entities. Playable area is heavily too small to show that count of entities, but you can try it :)";
|
||||||
|
|
||||||
EntityTemplate* tmpl;
|
EntityTemplate* tmpl;
|
||||||
Texture texture;
|
Texture texture;
|
||||||
|
|
@ -137,6 +162,9 @@ void simpleStart()
|
||||||
launcher.gui_manager.addSystem(becsID!MoveSystem,"Move Up System");
|
launcher.gui_manager.addSystem(becsID!MoveSystem,"Move Up System");
|
||||||
launcher.gui_manager.addSystem(becsID!DrawSystem,"Draw System");
|
launcher.gui_manager.addSystem(becsID!DrawSystem,"Draw System");
|
||||||
|
|
||||||
|
launcher.gui_manager.addComponent(CLocation(), "Location");
|
||||||
|
launcher.gui_manager.addComponent(CDrawDefault(), "DrawDefault");
|
||||||
|
|
||||||
simple.tmpl = launcher.manager.allocateTemplate([becsID!CLocation, becsID!CDrawDefault].staticArray);
|
simple.tmpl = launcher.manager.allocateTemplate([becsID!CLocation, becsID!CDrawDefault].staticArray);
|
||||||
//*simple.tmpl.getComponent!CTexCoordsIndex = TexCoordsManager.instance.getCoordIndex(vec4(0,48,16,16)*px);
|
//*simple.tmpl.getComponent!CTexCoordsIndex = TexCoordsManager.instance.getCoordIndex(vec4(0,48,16,16)*px);
|
||||||
//CLocation* loc_comp = simple.tmpl.getComponent!CLocation;
|
//CLocation* loc_comp = simple.tmpl.getComponent!CLocation;
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,8 @@ enum SnakePart : ubyte
|
||||||
|
|
||||||
struct Snake
|
struct Snake
|
||||||
{
|
{
|
||||||
__gshared const (char)* tips = "Use \"WASD\" keys to move.";
|
__gshared const (char)* tips = "Use \"WASD\" keys to move. If you loose you can always spawn new snake... or several snakes.
|
||||||
|
This demo is an example that in ECS you can make very \"non-ECS\" game";
|
||||||
|
|
||||||
EntityTemplate* apple_tmpl;
|
EntityTemplate* apple_tmpl;
|
||||||
EntityTemplate* snake_tmpl;
|
EntityTemplate* snake_tmpl;
|
||||||
|
|
@ -286,7 +287,7 @@ struct ParticleSystem
|
||||||
{
|
{
|
||||||
foreach(i;0..data.length)
|
foreach(i;0..data.length)
|
||||||
{
|
{
|
||||||
data.particle[i].life -= launcher.delta_time;
|
data.particle[i].life -= launcher.deltaTime;
|
||||||
if(data.particle[i].life < 0)launcher.manager.removeEntity(data.entities[i].id);
|
if(data.particle[i].life < 0)launcher.manager.removeEntity(data.entities[i].id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -328,7 +329,7 @@ struct AnimationSystem
|
||||||
{
|
{
|
||||||
foreach(i;0..data.length)
|
foreach(i;0..data.length)
|
||||||
{
|
{
|
||||||
data.animation[i].time += launcher.delta_time * 0.01;
|
data.animation[i].time += launcher.deltaTime * 0.01;
|
||||||
while(data.animation[i].time >= data.animation[i].frames.length)data.animation[i].time -= cast(float)data.animation[i].frames.length;
|
while(data.animation[i].time >= data.animation[i].frames.length)data.animation[i].time -= cast(float)data.animation[i].frames.length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -971,7 +972,7 @@ bool snakeLoop()
|
||||||
|
|
||||||
launcher.manager.begin();
|
launcher.manager.begin();
|
||||||
|
|
||||||
float delta_time = launcher.delta_time;
|
float delta_time = launcher.deltaTime;
|
||||||
if(delta_time > 2000)delta_time = 2000;
|
if(delta_time > 2000)delta_time = 2000;
|
||||||
__gshared float time = 0;
|
__gshared float time = 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,9 @@ extern(C):
|
||||||
|
|
||||||
struct SpaceInvaders
|
struct SpaceInvaders
|
||||||
{
|
{
|
||||||
__gshared const (char)* tips = "Use \"WASD\" keys to move and \"Space\" for shooting.";
|
__gshared const (char)* tips = "Use \"WASD\" keys to move and \"Space\" for shooting.
|
||||||
|
On start there is not to much to do. But you can spawn thousands of entities. You can even change guild for enemies to make them kilking themselves.
|
||||||
|
You can add any component to any entity which sometimes can give fun results. This demo wasn't created with such combination in mind, but that is something which comes naturally with ECS.";
|
||||||
|
|
||||||
EntityTemplate* enemy_tmpl;
|
EntityTemplate* enemy_tmpl;
|
||||||
EntityTemplate* ship_tmpl;
|
EntityTemplate* ship_tmpl;
|
||||||
|
|
@ -1019,7 +1021,7 @@ struct ShootingSystem
|
||||||
foreach(i;0..data.length)
|
foreach(i;0..data.length)
|
||||||
{
|
{
|
||||||
CWeapon* laser = &data.laser[i];
|
CWeapon* laser = &data.laser[i];
|
||||||
laser.shoot_time += launcher.delta_time;
|
laser.shoot_time += launcher.deltaTime;
|
||||||
while(laser.shoot_time > CWeapon.levels[laser.level - 1].reload_time)
|
while(laser.shoot_time > CWeapon.levels[laser.level - 1].reload_time)
|
||||||
{
|
{
|
||||||
CVelocity laser_velocity;
|
CVelocity laser_velocity;
|
||||||
|
|
@ -1824,7 +1826,7 @@ struct AnimationSystem
|
||||||
|
|
||||||
void onUpdate(EntitiesData data)
|
void onUpdate(EntitiesData data)
|
||||||
{
|
{
|
||||||
float dt = launcher.delta_time * 0.01;
|
float dt = launcher.deltaTime * 0.01;
|
||||||
if(data.looped)
|
if(data.looped)
|
||||||
{
|
{
|
||||||
foreach(i;0..data.length)
|
foreach(i;0..data.length)
|
||||||
|
|
@ -1865,7 +1867,7 @@ struct ParticleSystem
|
||||||
{
|
{
|
||||||
foreach(i;0..data.length)
|
foreach(i;0..data.length)
|
||||||
{
|
{
|
||||||
data.particle[i].life -= launcher.delta_time;
|
data.particle[i].life -= launcher.deltaTime;
|
||||||
if(data.particle[i].life < 0)launcher.manager.removeEntity(data.entitiy[i].id);
|
if(data.particle[i].life < 0)launcher.manager.removeEntity(data.entitiy[i].id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2086,6 +2088,7 @@ void spaceInvadersRegister()
|
||||||
launcher.manager.registerComponent!CTargetPlayerShip;
|
launcher.manager.registerComponent!CTargetPlayerShip;
|
||||||
launcher.manager.registerComponent!CChildren;
|
launcher.manager.registerComponent!CChildren;
|
||||||
launcher.manager.registerComponent!CWeaponLocation;
|
launcher.manager.registerComponent!CWeaponLocation;
|
||||||
|
launcher.manager.registerComponent!CVelocityFactor;
|
||||||
launcher.manager.registerComponent!CInit;
|
launcher.manager.registerComponent!CInit;
|
||||||
launcher.manager.registerComponent!CBoss;
|
launcher.manager.registerComponent!CBoss;
|
||||||
launcher.manager.registerComponent!CParts;
|
launcher.manager.registerComponent!CParts;
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,10 @@ struct CVelocityFactor
|
||||||
vec2 value = vec2(1);
|
vec2 value = vec2(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct CStatic
|
||||||
|
{
|
||||||
|
mixin ECS.Component;
|
||||||
|
}
|
||||||
|
|
||||||
struct DampingSystem
|
struct DampingSystem
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -49,11 +49,6 @@ struct CBVH
|
||||||
uint index;
|
uint index;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CStatic
|
|
||||||
{
|
|
||||||
mixin ECS.Component;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct CAABB
|
struct CAABB
|
||||||
{
|
{
|
||||||
mixin ECS.Component;
|
mixin ECS.Component;
|
||||||
|
|
@ -1003,6 +998,7 @@ struct AABBUpdater
|
||||||
@readonly CLocation[] location;
|
@readonly CLocation[] location;
|
||||||
@readonly CScale[] scale;
|
@readonly CScale[] scale;
|
||||||
@optional @readonly CRotation[] rotation;
|
@optional @readonly CRotation[] rotation;
|
||||||
|
@optional @readonly CStatic[] static_flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
void onAddEntity(EntitiesData data)
|
void onAddEntity(EntitiesData data)
|
||||||
|
|
@ -1015,6 +1011,8 @@ struct AABBUpdater
|
||||||
|
|
||||||
void onUpdate(EntitiesData data)
|
void onUpdate(EntitiesData data)
|
||||||
{
|
{
|
||||||
|
if(data.static_flag)return;
|
||||||
|
|
||||||
foreach(i; 0..data.length)
|
foreach(i; 0..data.length)
|
||||||
{
|
{
|
||||||
data.bounding[i] = AABB(data.location[i]-data.scale[i],data.location[i]+data.scale[i]);
|
data.bounding[i] = AABB(data.location[i]-data.scale[i],data.location[i]+data.scale[i]);
|
||||||
|
|
|
||||||
|
|
@ -395,7 +395,7 @@ struct GUIManager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void entityComponentsGUI()
|
void templateComponentsGUI()
|
||||||
{
|
{
|
||||||
if(selected_template >= templates.length)return;
|
if(selected_template >= templates.length)return;
|
||||||
EntityTemplate* tmpl = templates[selected_template].tmpl;
|
EntityTemplate* tmpl = templates[selected_template].tmpl;
|
||||||
|
|
@ -408,6 +408,19 @@ struct GUIManager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void entityComponentsGUI(Entity* entity)
|
||||||
|
{
|
||||||
|
if(!entity)return;
|
||||||
|
EntityMeta meta = entity.getMeta();
|
||||||
|
EntityManager.EntityInfo* info = meta.block.type_info;
|
||||||
|
foreach(comp_id; info.components)
|
||||||
|
{
|
||||||
|
// void* data_ptr = tmpl.entity_data.ptr;
|
||||||
|
void* comp_ptr = meta.getComponent(comp_id);//data_ptr + info.tmpl_deltas[comp_id];
|
||||||
|
componentGUI(comp_id, comp_ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void toolGui()
|
void toolGui()
|
||||||
{
|
{
|
||||||
ImGuiStyle * style = igGetStyle();
|
ImGuiStyle * style = igGetStyle();
|
||||||
|
|
@ -436,7 +449,7 @@ struct GUIManager
|
||||||
if(igIsItemHovered(0))igSetTooltip("Select entity to spawn (SHIFT + Scroll)");
|
if(igIsItemHovered(0))igSetTooltip("Select entity to spawn (SHIFT + Scroll)");
|
||||||
}
|
}
|
||||||
style.Colors[ImGuiCol_Header] = col;
|
style.Colors[ImGuiCol_Header] = col;
|
||||||
entityComponentsGUI();
|
templateComponentsGUI();
|
||||||
break;
|
break;
|
||||||
case Tool.component_manipulator:
|
case Tool.component_manipulator:
|
||||||
if(components.length)
|
if(components.length)
|
||||||
|
|
@ -458,6 +471,11 @@ struct GUIManager
|
||||||
if(selected_component < components.length)componentGUI(components[selected_component].component_id, components[selected_component].data);
|
if(selected_component < components.length)componentGUI(components[selected_component].component_id, components[selected_component].data);
|
||||||
break;
|
break;
|
||||||
case Tool.selector:
|
case Tool.selector:
|
||||||
|
{
|
||||||
|
Entity* entity = gEM.getEntity(launcher.selected_entity);
|
||||||
|
style.Colors[ImGuiCol_Header] = col;
|
||||||
|
entityComponentsGUI(entity);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
20
demos/source/meson.build
Normal file
20
demos/source/meson.build
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
demos_src += files(
|
||||||
|
'app.d',
|
||||||
|
'demos/brick_breaker.d',
|
||||||
|
'demos/bullet_madnes.d',
|
||||||
|
'demos/particles.d',
|
||||||
|
'demos/physics.d',
|
||||||
|
'demos/sandbox.d',
|
||||||
|
'demos/simple.d',
|
||||||
|
'demos/snake.d',
|
||||||
|
'demos/space_invaders.d',
|
||||||
|
'game_core/basic.d',
|
||||||
|
'game_core/collision.d',
|
||||||
|
'game_core/job_updater.d',
|
||||||
|
'game_core/rendering.d',
|
||||||
|
'gui/component.d',
|
||||||
|
'gui/manager.d',
|
||||||
|
'gui/system.d',
|
||||||
|
'gui/template_.d',
|
||||||
|
'gui/tool_circle.d',
|
||||||
|
)
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bindbc-sdl":"0.19.0",
|
"bindbc-sdl":"0.19.0",
|
||||||
"ecs":{"path":"../../"}
|
"bubel_ecs":{"path":"../../"}
|
||||||
},
|
},
|
||||||
"versions": [
|
"versions": [
|
||||||
"BindSDL_Image",
|
"BindSDL_Image",
|
||||||
|
|
|
||||||
25
demos/utils/meson.build
Normal file
25
demos/utils/meson.build
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
# Files
|
||||||
|
utils_src = files()
|
||||||
|
subdir('source/ecs_utils')
|
||||||
|
|
||||||
|
utils_inc = include_directories('source/')
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
ecs_utils_lib = library('ecs_utils', utils_src,
|
||||||
|
include_directories : [demos_inc, external_inc, utils_inc],
|
||||||
|
link_args : link_args,
|
||||||
|
d_module_versions : versions,
|
||||||
|
dependencies : [
|
||||||
|
decs_dep,
|
||||||
|
bindbc_loader_dep,
|
||||||
|
bindbc_sdl_dep,
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
ecs_utils_dep = declare_dependency(
|
||||||
|
include_directories : utils_inc,
|
||||||
|
link_with : ecs_utils_lib,
|
||||||
|
)
|
||||||
|
#shared_library('ecs_utils', utils_src, include_directories : [utils_inc], d_args: args, link_args: link_args, link_with: ecs_lib)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -70,7 +70,7 @@ struct Shader
|
||||||
|
|
||||||
version(WebAssembly)const char* glsl = "#version 100\n";
|
version(WebAssembly)const char* glsl = "#version 100\n";
|
||||||
else version(Android)const char* glsl = "#version 100\n";
|
else version(Android)const char* glsl = "#version 100\n";
|
||||||
else const char* glsl = "#version 330\n";
|
else const char* glsl = "#version 120\n";
|
||||||
const char* buffer = data.code.ptr;
|
const char* buffer = data.code.ptr;
|
||||||
char* ver;
|
char* ver;
|
||||||
version(WebAssembly)ver = cast(char*)"#define ver1 1\n#define GLES\n".ptr;
|
version(WebAssembly)ver = cast(char*)"#define ver1 1\n#define GLES\n".ptr;
|
||||||
|
|
|
||||||
18
demos/utils/source/ecs_utils/meson.build
Normal file
18
demos/utils/source/ecs_utils/meson.build
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
utils_src += files(
|
||||||
|
'gfx/mesh.d',
|
||||||
|
'gfx/sprite.d',
|
||||||
|
'gfx/mesh_module.d',
|
||||||
|
'gfx/material.d',
|
||||||
|
'gfx/shader.d',
|
||||||
|
'gfx/vertex.d',
|
||||||
|
'gfx/config.d',
|
||||||
|
'gfx/buffer.d',
|
||||||
|
'gfx/render_list.d',
|
||||||
|
'gfx/renderer.d',
|
||||||
|
'gfx/texture.d',
|
||||||
|
'utils.d',
|
||||||
|
'math/matrix.d',
|
||||||
|
'math/vector.d',
|
||||||
|
'imgui_styles.d',
|
||||||
|
'imgui_bind.d',
|
||||||
|
)
|
||||||
11
dub.json
11
dub.json
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "bubel_ecs",
|
"name": "bubel_ecs",
|
||||||
"targetName" : "ecs",
|
"targetName" : "bubel_ecs",
|
||||||
"authors": [
|
"authors": [
|
||||||
"Michał Masiukiewicz", "Dawid Masiukiewicz"
|
"Michał Masiukiewicz", "Dawid Masiukiewicz"
|
||||||
],
|
],
|
||||||
|
|
@ -50,7 +50,8 @@
|
||||||
],
|
],
|
||||||
"dflags": [
|
"dflags": [
|
||||||
"-unittest"
|
"-unittest"
|
||||||
]
|
],
|
||||||
|
"targetName" : "ecs"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "unittest-runner-cov",
|
"name": "unittest-runner-cov",
|
||||||
|
|
@ -64,7 +65,8 @@
|
||||||
"dflags": [
|
"dflags": [
|
||||||
"-unittest",
|
"-unittest",
|
||||||
"-cov"
|
"-cov"
|
||||||
]
|
],
|
||||||
|
"targetName" : "ecs"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name" : "library-betterC",
|
"name" : "library-betterC",
|
||||||
|
|
@ -127,7 +129,8 @@
|
||||||
"excludedSourceFiles":[
|
"excludedSourceFiles":[
|
||||||
"source\/win_dll.d",
|
"source\/win_dll.d",
|
||||||
"tests/tests.d"
|
"tests/tests.d"
|
||||||
]
|
],
|
||||||
|
"targetName" : "ecs"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
70
meson.build
70
meson.build
|
|
@ -1,42 +1,29 @@
|
||||||
project('DECS', 'd')
|
project('decs', 'd', version : '0.5.0')
|
||||||
|
|
||||||
src = [
|
|
||||||
'source/bubel/ecs/atomic.d',
|
|
||||||
'source/bubel/ecs/attributes.d',
|
|
||||||
'source/bubel/ecs/block_allocator.d',
|
|
||||||
'source/bubel/ecs/core.d',
|
|
||||||
'source/bubel/ecs/entity.d',
|
|
||||||
'source/bubel/ecs/events.d',
|
|
||||||
'source/bubel/ecs/hash_map.d',
|
|
||||||
'source/bubel/ecs/id_manager.d',
|
|
||||||
'source/bubel/ecs/manager.d',
|
|
||||||
'source/bubel/ecs/package.d',
|
|
||||||
'source/bubel/ecs/simple_vector.d',
|
|
||||||
'source/bubel/ecs/std.d',
|
|
||||||
'source/bubel/ecs/system.d',
|
|
||||||
'source/bubel/ecs/traits.d',
|
|
||||||
'source/bubel/ecs/vector.d'
|
|
||||||
]
|
|
||||||
|
|
||||||
tests_src = [
|
|
||||||
'tests/tests.d'
|
|
||||||
]
|
|
||||||
|
|
||||||
|
# Options
|
||||||
betterC_opt = get_option('betterC')
|
betterC_opt = get_option('betterC')
|
||||||
BuildDemos_opt = get_option('BuildDemos')
|
BuildDemos_opt = get_option('BuildDemos')
|
||||||
LTO_otp = get_option('LTO')
|
LTO_otp = get_option('LTO')
|
||||||
|
|
||||||
comp = meson.get_compiler('d')
|
summary('betterC enabled', betterC_opt)
|
||||||
|
summary('build demos', BuildDemos_opt)
|
||||||
|
summary('LTO enabled', LTO_otp)
|
||||||
|
|
||||||
comp_id = comp.get_id()
|
meson_minimum_version = '>=0.57.1'
|
||||||
|
assert(meson.version().version_compare(meson_minimum_version), 'Newer verson of meson required, current version: @0@, required: @1@'.format(meson.version(), meson_minimum_version))
|
||||||
|
|
||||||
|
# Files
|
||||||
|
src = files()
|
||||||
|
subdir('source')
|
||||||
|
|
||||||
|
inc = include_directories('source/')
|
||||||
|
|
||||||
|
# Arguments
|
||||||
args = []
|
args = []
|
||||||
link_args = []
|
link_args = []
|
||||||
|
|
||||||
if comp_id == 'gcc'
|
comp = meson.get_compiler('d')
|
||||||
args += '-pthread'
|
comp_id = comp.get_id()
|
||||||
link_args += '-pthread'
|
|
||||||
endif
|
|
||||||
|
|
||||||
if LTO_otp
|
if LTO_otp
|
||||||
if comp_id == 'gcc'
|
if comp_id == 'gcc'
|
||||||
|
|
@ -46,7 +33,7 @@ if LTO_otp
|
||||||
args += '-flto=thin'
|
args += '-flto=thin'
|
||||||
link_args += '-flto=thin'
|
link_args += '-flto=thin'
|
||||||
else
|
else
|
||||||
message('LTO don\'t work with DMD')
|
assert(false, 'Compiler "@0@" doesn\'t support LTO'.format(comp_id))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
@ -60,16 +47,27 @@ if betterC_opt
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
inc = include_directories('source/')
|
add_global_arguments(args, language : 'd')
|
||||||
tests_inc = include_directories('source/')
|
add_global_link_arguments(link_args, language : 'd')
|
||||||
|
|
||||||
ecs_lib = library('ecs', src, include_directories : [tests_inc, inc], d_args: args, link_args: link_args)
|
# Dependencies
|
||||||
|
threads_dep = dependency('threads')
|
||||||
|
|
||||||
executable('tests', tests_src, include_directories : [tests_inc, inc], d_args: args, link_args: link_args, link_with: ecs_lib)
|
ecs_lib = library('decs',
|
||||||
|
src,
|
||||||
|
include_directories : [inc],
|
||||||
|
)
|
||||||
|
|
||||||
bubel_ecs_dep = declare_dependency(include_directories : [inc], link_with : ecs_lib)
|
decs_dep = declare_dependency(
|
||||||
|
include_directories : [inc],
|
||||||
|
link_with : ecs_lib,
|
||||||
|
dependencies : threads_dep,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Tests
|
||||||
|
subdir('tests')
|
||||||
|
|
||||||
|
# Demos
|
||||||
if BuildDemos_opt
|
if BuildDemos_opt
|
||||||
subdir('demos/utils')
|
|
||||||
subdir('demos')
|
subdir('demos')
|
||||||
endif
|
endif
|
||||||
|
|
|
||||||
17
source/meson.build
Normal file
17
source/meson.build
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
src += files(
|
||||||
|
'bubel/ecs/atomic.d',
|
||||||
|
'bubel/ecs/attributes.d',
|
||||||
|
'bubel/ecs/block_allocator.d',
|
||||||
|
'bubel/ecs/core.d',
|
||||||
|
'bubel/ecs/entity.d',
|
||||||
|
'bubel/ecs/events.d',
|
||||||
|
'bubel/ecs/hash_map.d',
|
||||||
|
'bubel/ecs/id_manager.d',
|
||||||
|
'bubel/ecs/manager.d',
|
||||||
|
'bubel/ecs/package.d',
|
||||||
|
'bubel/ecs/simple_vector.d',
|
||||||
|
'bubel/ecs/std.d',
|
||||||
|
'bubel/ecs/system.d',
|
||||||
|
'bubel/ecs/traits.d',
|
||||||
|
'bubel/ecs/vector.d',
|
||||||
|
)
|
||||||
7
subprojects/bindbc-loader.wrap
Normal file
7
subprojects/bindbc-loader.wrap
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
[wrap-git]
|
||||||
|
url = https://github.com/BindBC/bindbc-loader.git
|
||||||
|
revision = 9a51af991acce3c67e51695c07bf3fa6419ef938
|
||||||
|
patch_directory = bindbc-loader
|
||||||
|
|
||||||
|
[provide]
|
||||||
|
dependency_names = bindbc-loader
|
||||||
7
subprojects/bindbc-sdl.wrap
Normal file
7
subprojects/bindbc-sdl.wrap
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
[wrap-git]
|
||||||
|
url = https://github.com/BindBC/bindbc-sdl.git
|
||||||
|
revision = 5c936064b7226630f5080f4b12b77ee39c8ac64b
|
||||||
|
patch_directory = bindbc-sdl
|
||||||
|
|
||||||
|
[provide]
|
||||||
|
dependency_names = bindbc-sdl
|
||||||
8
subprojects/cimgui.wrap
Normal file
8
subprojects/cimgui.wrap
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
[wrap-git]
|
||||||
|
url = https://github.com/cimgui/cimgui.git
|
||||||
|
revision = 1c65ee2bdc719fb3ef62b4615d66fe8effa21148
|
||||||
|
clone-recursive = true
|
||||||
|
patch_directory = cimgui
|
||||||
|
|
||||||
|
[provide]
|
||||||
|
dependency_names = cimgui
|
||||||
24
subprojects/packagefiles/bindbc-loader/meson.build
Normal file
24
subprojects/packagefiles/bindbc-loader/meson.build
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
project('bindbc-loader', 'd', version : '0.3.2', default_options: ['default_library=static'])
|
||||||
|
|
||||||
|
# Files
|
||||||
|
src = files(
|
||||||
|
'source/bindbc/loader/package.d',
|
||||||
|
'source/bindbc/loader/sharedlib.d',
|
||||||
|
'source/bindbc/loader/system.d',
|
||||||
|
)
|
||||||
|
|
||||||
|
inc = include_directories('source')
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
lib = library('bindbc-loader', src,
|
||||||
|
include_directories : [inc],
|
||||||
|
pic : true,
|
||||||
|
d_module_versions: ['BindBC_Static'],
|
||||||
|
)
|
||||||
|
|
||||||
|
bindbc_loader_dep = declare_dependency(
|
||||||
|
include_directories : [inc],
|
||||||
|
link_with : lib,
|
||||||
|
)
|
||||||
|
|
||||||
|
meson.override_dependency('bindbc-loader', bindbc_loader_dep)
|
||||||
72
subprojects/packagefiles/bindbc-sdl/meson.build
Normal file
72
subprojects/packagefiles/bindbc-sdl/meson.build
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
project('bindbc-sdl', 'd', version : '0.19.2', default_options: ['default_library=static'])
|
||||||
|
|
||||||
|
# Files
|
||||||
|
src = files(
|
||||||
|
'source/bindbc/sdl/bind/package.d',
|
||||||
|
'source/bindbc/sdl/bind/sdl.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlassert.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlatomic.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlaudio.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlblendmode.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlclipboard.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlcpuinfo.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlerror.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlevents.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlfilesystem.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlgamecontroller.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlgesture.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlhaptic.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlhints.d',
|
||||||
|
'source/bindbc/sdl/bind/sdljoystick.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlkeyboard.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlkeycode.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlloadso.d',
|
||||||
|
'source/bindbc/sdl/bind/sdllog.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlmessagebox.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlmouse.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlmutex.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlpixels.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlplatform.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlpower.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlrect.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlrender.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlrwops.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlscancode.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlshape.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlstdinc.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlsurface.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlsystem.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlsyswm.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlthread.d',
|
||||||
|
'source/bindbc/sdl/bind/sdltimer.d',
|
||||||
|
'source/bindbc/sdl/bind/sdltouch.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlversion.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlvideo.d',
|
||||||
|
'source/bindbc/sdl/bind/sdlvulkan.d',
|
||||||
|
'source/bindbc/sdl/config.d',
|
||||||
|
'source/bindbc/sdl/dynload.d',
|
||||||
|
'source/bindbc/sdl/image.d',
|
||||||
|
'source/bindbc/sdl/mixer.d',
|
||||||
|
'source/bindbc/sdl/net.d',
|
||||||
|
'source/bindbc/sdl/package.d',
|
||||||
|
'source/bindbc/sdl/ttf.d',
|
||||||
|
)
|
||||||
|
|
||||||
|
inc = include_directories('source')
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
bindbc_loader_dep = dependency('bindbc-loader')
|
||||||
|
|
||||||
|
lib = library('bindbc-sdl', src,
|
||||||
|
dependencies : bindbc_loader_dep,
|
||||||
|
include_directories : [inc],
|
||||||
|
d_module_versions: ['BindBC_Static'],
|
||||||
|
pic : true,
|
||||||
|
)
|
||||||
|
|
||||||
|
bindbc_sdl_dep = declare_dependency(
|
||||||
|
include_directories : [inc],
|
||||||
|
link_with : lib,
|
||||||
|
)
|
||||||
|
|
||||||
|
meson.override_dependency('bindbc-sdl', bindbc_sdl_dep)
|
||||||
29
subprojects/packagefiles/cimgui/meson.build
Normal file
29
subprojects/packagefiles/cimgui/meson.build
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
project('cimgui', 'cpp', version : '1.73.0', default_options: ['default_library=shared', 'warning_level=1'])
|
||||||
|
|
||||||
|
# Files
|
||||||
|
src = [
|
||||||
|
'cimgui.cpp',
|
||||||
|
'imgui/imgui.cpp',
|
||||||
|
'imgui/imgui_draw.cpp',
|
||||||
|
'imgui/imgui_demo.cpp',
|
||||||
|
'imgui/imgui_widgets.cpp',
|
||||||
|
]
|
||||||
|
|
||||||
|
inc = [ '.' ]
|
||||||
|
pub_inc = [ 'imgui' ]
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
# bindbc_loader_dep = dependency('bindbc-loader')
|
||||||
|
|
||||||
|
lib = shared_library('cimgui', src,
|
||||||
|
# dependencies : bindbc_loader_dep,
|
||||||
|
include_directories : [inc, pub_inc],
|
||||||
|
# pic : true,
|
||||||
|
)
|
||||||
|
|
||||||
|
cimgui_dep = declare_dependency(
|
||||||
|
include_directories : [pub_inc],
|
||||||
|
link_with : lib,
|
||||||
|
)
|
||||||
|
|
||||||
|
meson.override_dependency('cimgui', cimgui_dep)
|
||||||
13
tests/meson.build
Normal file
13
tests/meson.build
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
tests_src = files(
|
||||||
|
'tests.d',
|
||||||
|
)
|
||||||
|
|
||||||
|
exe = executable('decs-tests',
|
||||||
|
tests_src,
|
||||||
|
include_directories : [inc],
|
||||||
|
d_args : args,
|
||||||
|
link_args : link_args,
|
||||||
|
dependencies : decs_dep,
|
||||||
|
)
|
||||||
|
|
||||||
|
test('basic-tests', exe)
|
||||||
|
|
@ -102,7 +102,7 @@ static struct CPosition
|
||||||
|
|
||||||
static struct TestComp
|
static struct TestComp
|
||||||
{
|
{
|
||||||
mixin ECS.Component; //__gshared ushort component_id;
|
mixin ECS.Component; //__gshared becsID!ushort;
|
||||||
int a = 1;
|
int a = 1;
|
||||||
ulong b = 2;
|
ulong b = 2;
|
||||||
|
|
||||||
|
|
@ -119,7 +119,7 @@ static struct TestComp
|
||||||
|
|
||||||
static struct TestComp2
|
static struct TestComp2
|
||||||
{
|
{
|
||||||
mixin ECS.Component; //__gshared ushort component_id;
|
mixin ECS.Component; //__gshared becsID!ushort;
|
||||||
int b = 3;
|
int b = 3;
|
||||||
int a = 4;
|
int a = 4;
|
||||||
|
|
||||||
|
|
@ -136,7 +136,7 @@ static struct TestComp2
|
||||||
|
|
||||||
static struct TestComp3
|
static struct TestComp3
|
||||||
{
|
{
|
||||||
mixin ECS.Component; //__gshared ushort component_id;
|
mixin ECS.Component; //__gshared becsID!ushort;
|
||||||
uint gg = 5; //good game
|
uint gg = 5; //good game
|
||||||
uint bg = 6; //bad game
|
uint bg = 6; //bad game
|
||||||
|
|
||||||
|
|
@ -153,7 +153,7 @@ static struct TestComp3
|
||||||
|
|
||||||
static struct TestComp4
|
static struct TestComp4
|
||||||
{
|
{
|
||||||
mixin ECS.Component; //__gshared ushort component_id;
|
mixin ECS.Component; //__gshared becsID!ushort;
|
||||||
uint gg = 7; //good game
|
uint gg = 7; //good game
|
||||||
uint bg = 8; //bad game
|
uint bg = 8; //bad game
|
||||||
ulong a = 9;
|
ulong a = 9;
|
||||||
|
|
@ -174,7 +174,7 @@ static struct TestComp4
|
||||||
|
|
||||||
static struct TestComp5
|
static struct TestComp5
|
||||||
{
|
{
|
||||||
mixin ECS.Component; //__gshared ushort component_id;
|
mixin ECS.Component; //__gshared becsID!ushort;
|
||||||
uint gg = 7; //good game
|
uint gg = 7; //good game
|
||||||
uint bg = 8; //bad game
|
uint bg = 8; //bad game
|
||||||
ulong a = 9;
|
ulong a = 9;
|
||||||
|
|
@ -735,12 +735,12 @@ else:
|
||||||
printf("Systems register: %f usecs\n", cast(float)(Time.getUSecTime() - time));
|
printf("Systems register: %f usecs\n", cast(float)(Time.getUSecTime() - time));
|
||||||
time = Time.getUSecTime();
|
time = Time.getUSecTime();
|
||||||
|
|
||||||
//ushort[3] ids = [TestComp2.component_id, TestComp.component_id, TestComp4.component_id];
|
//ushort[3] ids = [becsID!TestComp2, becsID!TestComp, becsID!TestComp4];
|
||||||
ushort[2] ids = [TestComp2.component_id, TestComp.component_id];
|
ushort[2] ids = [becsID!TestComp2, becsID!TestComp];
|
||||||
EntityTemplate* tmpl = gEM.allocateTemplate(ids);
|
EntityTemplate* tmpl = gEM.allocateTemplate(ids);
|
||||||
|
|
||||||
//ushort[3] ids2 = [TestComp3.component_id, TestComp.component_id, TestComp4.component_id];
|
//ushort[3] ids2 = [becsID!TestComp3, becsID!TestComp, becsID!TestComp4];
|
||||||
ushort[2] ids2 = [TestComp3.component_id, TestComp.component_id];
|
ushort[2] ids2 = [becsID!TestComp3, becsID!TestComp];
|
||||||
EntityTemplate* tmpl2 = gEM.allocateTemplate(ids2);
|
EntityTemplate* tmpl2 = gEM.allocateTemplate(ids2);
|
||||||
////writeln(tmpl.info.components[]);
|
////writeln(tmpl.info.components[]);
|
||||||
//*cast(EntityID*) tmpl.entity_data.ptr = EntityID(1, 1);
|
//*cast(EntityID*) tmpl.entity_data.ptr = EntityID(1, 1);
|
||||||
|
|
@ -751,7 +751,7 @@ else:
|
||||||
|
|
||||||
|
|
||||||
time = Time.getUSecTime();
|
time = Time.getUSecTime();
|
||||||
ushort[1] empty_ids = [CPosition.component_id];
|
ushort[1] empty_ids = [becsID!CPosition];
|
||||||
EntityTemplate* tmpl_empty = gEM.allocateTemplate(empty_ids);
|
EntityTemplate* tmpl_empty = gEM.allocateTemplate(empty_ids);
|
||||||
|
|
||||||
gEM.commit();
|
gEM.commit();
|
||||||
|
|
@ -1003,7 +1003,7 @@ else:
|
||||||
|
|
||||||
gEM.commit();
|
gEM.commit();
|
||||||
|
|
||||||
System* sys = EntityManager.instance.getSystem(TestSystem2.system_id);
|
System* sys = EntityManager.instance.getSystem(becsID!TestSystem2);
|
||||||
|
|
||||||
ExternalUpdateCallTest external_update_test;
|
ExternalUpdateCallTest external_update_test;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue