Added entity filering support and fixed minor bug
This commit is contained in:
parent
5018464a41
commit
8cba2626be
3 changed files with 48 additions and 12 deletions
|
|
@ -134,9 +134,21 @@ struct Launcher
|
||||||
vec2 position;
|
vec2 position;
|
||||||
ComponentRef[] add_comps;
|
ComponentRef[] add_comps;
|
||||||
ushort[] rem_comps;
|
ushort[] rem_comps;
|
||||||
|
ushort[] filter;
|
||||||
|
|
||||||
|
bool filterEntity(ref const Entity entity)
|
||||||
|
{
|
||||||
|
EntityMeta meta = entity.getMeta();
|
||||||
|
foreach(id;filter)
|
||||||
|
{
|
||||||
|
if(!meta.hasComponent(id))return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void removeEntity(IteratorSystem.EntitiesData data)
|
void removeEntity(IteratorSystem.EntitiesData data)
|
||||||
{
|
{
|
||||||
|
if(!filterEntity(data.entity[0]))return;
|
||||||
foreach(i;0..data.length)
|
foreach(i;0..data.length)
|
||||||
{
|
{
|
||||||
vec2 rel_vec = data.location[i] - position;
|
vec2 rel_vec = data.location[i] - position;
|
||||||
|
|
@ -147,6 +159,7 @@ struct Launcher
|
||||||
|
|
||||||
void addComponent(IteratorSystem.EntitiesData data)
|
void addComponent(IteratorSystem.EntitiesData data)
|
||||||
{
|
{
|
||||||
|
if(!filterEntity(data.entity[0]))return;
|
||||||
foreach(i;0..data.length)
|
foreach(i;0..data.length)
|
||||||
{
|
{
|
||||||
vec2 rel_vec = data.location[i] - position;
|
vec2 rel_vec = data.location[i] - position;
|
||||||
|
|
@ -157,6 +170,7 @@ struct Launcher
|
||||||
|
|
||||||
void overrideComponent(IteratorSystem.EntitiesData data)
|
void overrideComponent(IteratorSystem.EntitiesData data)
|
||||||
{
|
{
|
||||||
|
if(!filterEntity(data.entity[0]))return;
|
||||||
foreach(i;0..data.length)
|
foreach(i;0..data.length)
|
||||||
{
|
{
|
||||||
vec2 rel_vec = data.location[i] - position;
|
vec2 rel_vec = data.location[i] - position;
|
||||||
|
|
@ -171,6 +185,7 @@ struct Launcher
|
||||||
|
|
||||||
void removeComponent(IteratorSystem.EntitiesData data)
|
void removeComponent(IteratorSystem.EntitiesData data)
|
||||||
{
|
{
|
||||||
|
if(!filterEntity(data.entity[0]))return;
|
||||||
foreach(i;0..data.length)
|
foreach(i;0..data.length)
|
||||||
{
|
{
|
||||||
vec2 rel_vec = data.location[i] - position;
|
vec2 rel_vec = data.location[i] - position;
|
||||||
|
|
@ -185,6 +200,7 @@ struct Launcher
|
||||||
Iterator iterator;
|
Iterator iterator;
|
||||||
iterator.size2 = size2;
|
iterator.size2 = size2;
|
||||||
iterator.position = position;
|
iterator.position = position;
|
||||||
|
iterator.filter = gui_manager.filter_list[];
|
||||||
|
|
||||||
switch(used_tool)
|
switch(used_tool)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,8 @@ struct GUIManager
|
||||||
Vector!ComponentGUI components;
|
Vector!ComponentGUI components;
|
||||||
Vector!TemplateGUI templates;
|
Vector!TemplateGUI templates;
|
||||||
Vector!ComponentEditGUI edit_components;
|
Vector!ComponentEditGUI edit_components;
|
||||||
|
Vector!bool filter;
|
||||||
|
Vector!ushort filter_list;
|
||||||
|
|
||||||
int selected_template = 0;
|
int selected_template = 0;
|
||||||
int selected_component = 0;
|
int selected_component = 0;
|
||||||
|
|
@ -62,8 +64,14 @@ struct GUIManager
|
||||||
if(comp.variables)Mallocator.dispose(comp.variables);
|
if(comp.variables)Mallocator.dispose(comp.variables);
|
||||||
comp.variables = null;
|
comp.variables = null;
|
||||||
comp.used = 0;
|
comp.used = 0;
|
||||||
|
comp.name = null;
|
||||||
|
}
|
||||||
|
foreach(ref comp; filter)
|
||||||
|
{
|
||||||
|
comp = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filter_list.clear();
|
||||||
systems.clear();
|
systems.clear();
|
||||||
templates.clear();
|
templates.clear();
|
||||||
components.clear();
|
components.clear();
|
||||||
|
|
@ -384,16 +392,14 @@ struct GUIManager
|
||||||
{
|
{
|
||||||
if(igListBoxHeaderInt("Components",cast(int)components.length,cast(int)components.length))
|
if(igListBoxHeaderInt("Components",cast(int)components.length,cast(int)components.length))
|
||||||
{
|
{
|
||||||
|
foreach(i, comp; components)
|
||||||
{
|
{
|
||||||
foreach(i, comp; components)
|
if(igSelectable(comp.name,selected_component == i,0,ImVec2(0,0)))
|
||||||
{
|
{
|
||||||
if(igSelectable(comp.name,selected_component == i,0,ImVec2(0,0)))
|
selected_component = cast(uint)i;
|
||||||
{
|
|
||||||
selected_component = cast(uint)i;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
igListBoxFooter();
|
|
||||||
}
|
}
|
||||||
|
igListBoxFooter();
|
||||||
}
|
}
|
||||||
if(igIsItemHovered(0))igSetTooltip("Select component to add/remove (SHIFT + Scroll)");
|
if(igIsItemHovered(0))igSetTooltip("Select component to add/remove (SHIFT + Scroll)");
|
||||||
}
|
}
|
||||||
|
|
@ -407,26 +413,40 @@ struct GUIManager
|
||||||
style.Colors[ImGuiCol_Header] = col;
|
style.Colors[ImGuiCol_Header] = col;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void genFilterList()
|
||||||
|
{
|
||||||
|
filter_list.clear();
|
||||||
|
foreach(i, comp; filter)
|
||||||
|
{
|
||||||
|
if(comp)
|
||||||
|
{
|
||||||
|
filter_list.add(cast(ushort)i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void filterGUI()
|
void filterGUI()
|
||||||
{
|
{
|
||||||
ImGuiStyle * style = igGetStyle();
|
ImGuiStyle * style = igGetStyle();
|
||||||
ImVec4 col = style.Colors[ImGuiCol_Header];
|
ImVec4 col = style.Colors[ImGuiCol_Header];
|
||||||
style.Colors[ImGuiCol_Header] = style.Colors[ImGuiCol_TextSelectedBg];
|
style.Colors[ImGuiCol_Header] = style.Colors[ImGuiCol_TextSelectedBg];
|
||||||
|
|
||||||
|
if(filter.length < edit_components.length)filter.length(edit_components.length);
|
||||||
|
|
||||||
int length = 0;
|
int length = 0;
|
||||||
foreach(comp; edit_components)
|
foreach(comp; edit_components)
|
||||||
{
|
{
|
||||||
if(comp.name !is null)length++;
|
if(comp.name !is null)length++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(length && igListBoxHeaderInt("Components",cast(int)length,cast(int)length))
|
if(length && igListBoxHeaderInt("Components##FilterComponents",cast(int)length,cast(int)length))
|
||||||
{
|
{
|
||||||
foreach(i, comp; edit_components)
|
foreach(i, ref comp; edit_components)
|
||||||
{
|
{
|
||||||
if(comp.name is null)return;
|
if(comp.name is null)continue;
|
||||||
if(igSelectable(comp.name,false,0,ImVec2(0,0)))
|
if(igSelectableBoolPtr(comp.name,&filter[i],0,ImVec2(0,0)))
|
||||||
{
|
{
|
||||||
|
genFilterList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
igListBoxFooter();
|
igListBoxFooter();
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ struct Entity
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
EntityMeta getMeta()
|
EntityMeta getMeta() const
|
||||||
{
|
{
|
||||||
EntityMeta meta;
|
EntityMeta meta;
|
||||||
meta.block = gEM.getMetaData(&this);
|
meta.block = gEM.getMetaData(&this);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue